"""
智能干预推荐系统
基于风险预测结果和权威医学指南生成个性化干预建议
"""

import json
from typing import Dict, List, Any
from datetime import datetime, timedelta

class InterventionRecommender:
    """智能干预推荐器"""
    
    def __init__(self):
        self.guidelines = self._load_medical_guidelines()
        self.intervention_templates = self._load_intervention_templates()
        
    def _load_medical_guidelines(self) -> Dict:
        """加载医学指南"""
        return {
            'hypertension': {
                'name': '中国高血压防治指南（2018年修订版）',
                'source': '中华医学会心血管病学分会',
                'key_points': [
                    '血压目标：一般患者<140/90mmHg，糖尿病、慢性肾病<130/80mmHg',
                    '生活方式干预：限盐<6g/日，戒烟限酒，适量运动',
                    '药物治疗：ACEI/ARB、CCB、利尿剂等',
                    '定期监测：家庭血压监测，每月随访'
                ]
            },
            'diabetes': {
                'name': '中国2型糖尿病防治指南（2020年版）',
                'source': '中华医学会糖尿病学分会',
                'key_points': [
                    '血糖目标：空腹血糖4.4-7.0mmol/L，餐后2h<10.0mmol/L',
                    '生活方式干预：饮食控制，规律运动，体重管理',
                    '药物治疗：二甲双胍、磺脲类、DPP-4抑制剂等',
                    '并发症筛查：定期检查眼底、肾功能、神经病变'
                ]
            },
            'lifestyle': {
                'name': '中国居民膳食指南（2022）',
                'source': '中国营养学会',
                'key_points': [
                    '食物多样，谷类为主',
                    '吃动平衡，健康体重',
                    '多吃蔬果、奶类、大豆',
                    '适量吃鱼、禽、蛋、瘦肉',
                    '少盐少油，控糖限酒'
                ]
            }
        }
    
    def _load_intervention_templates(self) -> Dict:
        """加载干预建议模板"""
        return {
            'diet': {
                'high_risk': [
                    {
                        'title': '严格饮食控制',
                        'description': '采用DASH饮食模式，每日钠摄入<1500mg',
                        'details': [
                            '每日蔬菜500g以上，水果200-350g',
                            '全谷物占主食1/3以上',
                            '低脂奶制品300-500ml',
                            '坚果类25-35g',
                            '限制加工食品和含糖饮料'
                        ],
                        'duration': '长期坚持',
                        'evidence_level': 'A级证据',
                        'reference': 'DASH饮食研究，NEJM 1997'
                    }
                ],
                'medium_risk': [
                    {
                        'title': '适度饮食调整',
                        'description': '遵循中国居民膳食指南，控制总热量',
                        'details': [
                            '每日蔬菜300-500g，水果200-350g',
                            '适量全谷物，减少精制谷物',
                            '选择低脂蛋白质来源',
                            '控制油盐用量'
                        ],
                        'duration': '3-6个月',
                        'evidence_level': 'B级证据',
                        'reference': '中国居民膳食指南2022'
                    }
                ],
                'low_risk': [
                    {
                        'title': '健康饮食维持',
                        'description': '保持当前良好饮食习惯，适当优化',
                        'details': [
                            '继续均衡饮食',
                            '适量增加蔬菜水果',
                            '保持规律进餐时间',
                            '注意食物多样性'
                        ],
                        'duration': '持续',
                        'evidence_level': 'C级证据',
                        'reference': '一般营养学建议'
                    }
                ]
            },
            'exercise': {
                'high_risk': [
                    {
                        'title': '强化运动计划',
                        'description': '每周至少150分钟中等强度有氧运动',
                        'details': [
                            '有氧运动：快走、游泳、骑自行车',
                            '每周3-5次，每次30-45分钟',
                            '抗阻训练：每周2-3次',
                            '柔韧性训练：每日10-15分钟'
                        ],
                        'duration': '长期坚持',
                        'evidence_level': 'A级证据',
                        'reference': 'ACSM运动处方指南'
                    }
                ],
                'medium_risk': [
                    {
                        'title': '规律运动计划',
                        'description': '每周至少150分钟中等强度运动',
                        'details': [
                            '有氧运动：快走、慢跑、游泳',
                            '每周3-4次，每次30分钟',
                            '日常活动：多走楼梯，少坐电梯',
                            '工作间隙：每2小时活动5分钟'
                        ],
                        'duration': '6个月',
                        'evidence_level': 'B级证据',
                        'reference': 'WHO身体活动指南'
                    }
                ],
                'low_risk': [
                    {
                        'title': '维持运动习惯',
                        'description': '保持当前运动水平，适当增加',
                        'details': [
                            '继续现有运动习惯',
                            '可适当增加运动强度或时间',
                            '尝试新的运动形式',
                            '保持运动乐趣'
                        ],
                        'duration': '持续',
                        'evidence_level': 'C级证据',
                        'reference': '一般运动建议'
                    }
                ]
            },
            'monitoring': {
                'high_risk': [
                    {
                        'title': '密切监测计划',
                        'description': '每日监测关键指标，每月随访',
                        'details': [
                            '每日测量血压（早晚各一次）',
                            '每周测量体重',
                            '每月检测血糖（如有糖尿病风险）',
                            '每3个月全面体检'
                        ],
                        'duration': '长期',
                        'evidence_level': 'A级证据',
                        'reference': '高血压管理指南'
                    }
                ],
                'medium_risk': [
                    {
                        'title': '定期监测计划',
                        'description': '每周监测，每季度随访',
                        'details': [
                            '每周测量血压2-3次',
                            '每月测量体重',
                            '每季度检测血糖',
                            '每6个月全面体检'
                        ],
                        'duration': '1年',
                        'evidence_level': 'B级证据',
                        'reference': '慢性病管理指南'
                    }
                ],
                'low_risk': [
                    {
                        'title': '常规监测计划',
                        'description': '定期体检，关注健康指标',
                        'details': [
                            '每月测量血压1-2次',
                            '每季度测量体重',
                            '每年全面体检',
                            '关注身体变化'
                        ],
                        'duration': '持续',
                        'evidence_level': 'C级证据',
                        'reference': '预防医学指南'
                    }
                ]
            },
            'medication': {
                'high_risk': [
                    {
                        'title': '药物治疗评估',
                        'description': '建议咨询医生评估药物治疗必要性',
                        'details': [
                            '高血压：考虑ACEI/ARB类药物',
                            '糖尿病：考虑二甲双胍等',
                            '血脂异常：考虑他汀类药物',
                            '定期复查药物效果和副作用'
                        ],
                        'duration': '根据医生建议',
                        'evidence_level': 'A级证据',
                        'reference': '相关疾病治疗指南'
                    }
                ],
                'medium_risk': [
                    {
                        'title': '预防性干预',
                        'description': '生活方式干预为主，必要时药物预防',
                        'details': [
                            '优先生活方式干预',
                            '3-6个月后评估效果',
                            '如效果不佳考虑药物干预',
                            '定期随访评估'
                        ],
                        'duration': '6-12个月',
                        'evidence_level': 'B级证据',
                        'reference': '疾病预防指南'
                    }
                ],
                'low_risk': [
                    {
                        'title': '健康维护',
                        'description': '继续健康生活方式，无需药物干预',
                        'details': [
                            '维持健康生活方式',
                            '定期体检监测',
                            '关注风险因素变化',
                            '必要时调整干预策略'
                        ],
                        'duration': '持续',
                        'evidence_level': 'C级证据',
                        'reference': '健康维护指南'
                    }
                ]
            }
        }
    
    def get_recommendations(self, prediction_result: Dict, user_data: Dict) -> Dict:
        """
        获取个性化干预建议
        
        Args:
            prediction_result (dict): 预测结果
            user_data (dict): 用户数据
            
        Returns:
            dict: 干预建议
        """
        try:
            # 确定整体风险等级
            overall_risk = prediction_result.get('overall_risk', {})
            risk_level = overall_risk.get('risk_level', 'low')
            
            # 获取具体疾病风险
            ht_risk = prediction_result.get('hypertension_risk', {})
            dm_risk = prediction_result.get('diabetes_risk', {})
            
            # 生成干预建议
            recommendations = {
                'overall_recommendation': self._generate_overall_recommendation(risk_level, user_data),
                'disease_specific': self._generate_disease_specific_recommendations(ht_risk, dm_risk),
                'lifestyle_interventions': self._generate_lifestyle_recommendations(risk_level, user_data),
                'monitoring_plan': self._generate_monitoring_plan(risk_level, ht_risk, dm_risk),
                'follow_up_schedule': self._generate_follow_up_schedule(risk_level),
                'emergency_guidance': self._generate_emergency_guidance(risk_level),
                'guidelines_references': self._get_relevant_guidelines(ht_risk, dm_risk),
                'implementation_timeline': self._generate_implementation_timeline(risk_level)
            }
            
            return recommendations
            
        except Exception as e:
            print(f"生成干预建议错误: {e}")
            return self._generate_default_recommendations()
    
    def _generate_overall_recommendation(self, risk_level: str, user_data: Dict) -> Dict:
        """生成整体建议"""
        recommendations = {
            'low': {
                'title': '健康维护建议',
                'summary': '您目前的慢性病风险较低，建议继续保持健康的生活方式',
                'priority': '维持现状',
                'urgency': '低',
                'expected_outcome': '维持低风险状态'
            },
            'medium': {
                'title': '风险控制建议',
                'summary': '您存在中等程度的慢性病风险，建议采取积极的生活方式干预',
                'priority': '积极干预',
                'urgency': '中等',
                'expected_outcome': '降低风险至低水平'
            },
            'high': {
                'title': '紧急干预建议',
                'summary': '您存在较高的慢性病风险，建议立即采取综合干预措施',
                'priority': '紧急干预',
                'urgency': '高',
                'expected_outcome': '显著降低风险'
            }
        }
        
        return recommendations.get(risk_level, recommendations['low'])
    
    def _generate_disease_specific_recommendations(self, ht_risk: Dict, dm_risk: Dict) -> Dict:
        """生成疾病特异性建议"""
        recommendations = {}
        
        # 高血压建议
        if ht_risk.get('risk_level') in ['medium', 'high']:
            recommendations['hypertension'] = {
                'risk_level': ht_risk.get('risk_level'),
                'probability': ht_risk.get('probability', 0),
                'specific_interventions': [
                    '限盐饮食：每日钠摄入<6g',
                    '规律运动：每周150分钟中等强度运动',
                    '体重管理：BMI控制在18.5-24.9',
                    '戒烟限酒：完全戒烟，限制饮酒',
                    '压力管理：学习放松技巧，保证充足睡眠'
                ],
                'target_values': {
                    'blood_pressure': '<140/90mmHg',
                    'sodium_intake': '<6g/日',
                    'exercise': '150分钟/周'
                },
                'monitoring_frequency': '每日测量血压'
            }
        
        # 糖尿病建议
        if dm_risk.get('risk_level') in ['medium', 'high']:
            recommendations['diabetes'] = {
                'risk_level': dm_risk.get('risk_level'),
                'probability': dm_risk.get('probability', 0),
                'specific_interventions': [
                    '血糖管理：控制碳水化合物摄入',
                    '体重控制：减重5-10%可显著改善血糖',
                    '规律运动：餐后30分钟开始运动',
                    '饮食控制：低GI食物，定时定量',
                    '足部护理：每日检查足部，预防并发症'
                ],
                'target_values': {
                    'blood_glucose': '4.4-7.0mmol/L',
                    'hba1c': '<7%',
                    'weight_loss': '5-10%'
                },
                'monitoring_frequency': '每周检测血糖'
            }
        
        return recommendations
    
    def _generate_lifestyle_recommendations(self, risk_level: str, user_data: Dict) -> Dict:
        """生成生活方式建议"""
        interventions = self.intervention_templates
        
        return {
            'diet': interventions['diet'].get(risk_level, interventions['diet']['low_risk']),
            'exercise': interventions['exercise'].get(risk_level, interventions['exercise']['low_risk']),
            'medication': interventions['medication'].get(risk_level, interventions['medication']['low_risk'])
        }
    
    def _generate_monitoring_plan(self, risk_level: str, ht_risk: Dict, dm_risk: Dict) -> Dict:
        """生成监测计划"""
        monitoring_templates = self.intervention_templates['monitoring']
        base_plan = monitoring_templates.get(risk_level, monitoring_templates['low_risk'])
        
        # 根据具体疾病风险调整监测计划
        enhanced_plan = base_plan.copy()
        
        if ht_risk.get('risk_level') in ['medium', 'high']:
            enhanced_plan[0]['details'].append('重点关注血压变化趋势')
        
        if dm_risk.get('risk_level') in ['medium', 'high']:
            enhanced_plan[0]['details'].append('定期检测糖化血红蛋白')
        
        return {
            'plan': enhanced_plan,
            'key_metrics': self._get_key_monitoring_metrics(ht_risk, dm_risk),
            'alert_thresholds': self._get_alert_thresholds(risk_level)
        }
    
    def _get_key_monitoring_metrics(self, ht_risk: Dict, dm_risk: Dict) -> List[str]:
        """获取关键监测指标"""
        metrics = ['体重', '血压']
        
        if ht_risk.get('risk_level') in ['medium', 'high']:
            metrics.extend(['心率', '血脂'])
        
        if dm_risk.get('risk_level') in ['medium', 'high']:
            metrics.extend(['血糖', '糖化血红蛋白'])
        
        return metrics
    
    def _get_alert_thresholds(self, risk_level: str) -> Dict:
        """获取预警阈值"""
        thresholds = {
            'low': {
                'blood_pressure': '>140/90mmHg',
                'blood_glucose': '>7.0mmol/L',
                'weight_change': '>5%'
            },
            'medium': {
                'blood_pressure': '>135/85mmHg',
                'blood_glucose': '>6.5mmol/L',
                'weight_change': '>3%'
            },
            'high': {
                'blood_pressure': '>130/80mmHg',
                'blood_glucose': '>6.0mmol/L',
                'weight_change': '>2%'
            }
        }
        
        return thresholds.get(risk_level, thresholds['low'])
    
    def _generate_follow_up_schedule(self, risk_level: str) -> Dict:
        """生成随访计划"""
        schedules = {
            'low': {
                'frequency': '每6个月',
                'next_appointment': (datetime.now() + timedelta(days=180)).strftime('%Y-%m-%d'),
                'focus': '健康维护，风险因素监测'
            },
            'medium': {
                'frequency': '每3个月',
                'next_appointment': (datetime.now() + timedelta(days=90)).strftime('%Y-%m-%d'),
                'focus': '生活方式干预效果评估'
            },
            'high': {
                'frequency': '每月',
                'next_appointment': (datetime.now() + timedelta(days=30)).strftime('%Y-%m-%d'),
                'focus': '综合干预效果评估，必要时调整方案'
            }
        }
        
        return schedules.get(risk_level, schedules['low'])
    
    def _generate_emergency_guidance(self, risk_level: str) -> Dict:
        """生成紧急情况指导"""
        if risk_level == 'high':
            return {
                'emergency_contacts': [
                    '急救电话：120',
                    '心内科急诊',
                    '内分泌科急诊'
                ],
                'warning_signs': [
                    '胸痛、胸闷',
                    '严重头痛、恶心呕吐',
                    '意识模糊、昏迷',
                    '严重呼吸困难'
                ],
                'immediate_actions': [
                    '立即拨打急救电话',
                    '保持患者安静',
                    '记录症状发生时间',
                    '准备相关医疗资料'
                ]
            }
        else:
            return {
                'emergency_contacts': ['急救电话：120'],
                'warning_signs': ['持续不适症状'],
                'immediate_actions': ['及时就医咨询']
            }
    
    def _get_relevant_guidelines(self, ht_risk: Dict, dm_risk: Dict) -> List[Dict]:
        """获取相关指南"""
        guidelines = []
        
        if ht_risk.get('risk_level') in ['medium', 'high']:
            guidelines.append(self.guidelines['hypertension'])
        
        if dm_risk.get('risk_level') in ['medium', 'high']:
            guidelines.append(self.guidelines['diabetes'])
        
        guidelines.append(self.guidelines['lifestyle'])
        
        return guidelines
    
    def _generate_implementation_timeline(self, risk_level: str) -> Dict:
        """生成实施时间表"""
        timelines = {
            'low': {
                'immediate': ['继续当前健康习惯'],
                '1_month': ['优化饮食结构'],
                '3_months': ['增加运动量'],
                '6_months': ['全面体检评估']
            },
            'medium': {
                'immediate': ['开始饮食控制', '制定运动计划'],
                '1_month': ['建立监测习惯', '调整生活方式'],
                '3_months': ['评估干预效果', '调整干预方案'],
                '6_months': ['全面体检', '长期计划制定']
            },
            'high': {
                'immediate': ['立即开始综合干预', '联系医生咨询'],
                '1_week': ['建立监测体系', '开始药物治疗评估'],
                '1_month': ['评估初期效果', '调整干预强度'],
                '3_months': ['全面效果评估', '制定长期管理计划']
            }
        }
        
        return timelines.get(risk_level, timelines['low'])
    
    def _generate_default_recommendations(self) -> Dict:
        """生成默认建议"""
        return {
            'overall_recommendation': {
                'title': '健康维护建议',
                'summary': '建议保持健康的生活方式，定期体检',
                'priority': '维持现状',
                'urgency': '低',
                'expected_outcome': '维持健康状态'
            },
            'disease_specific': {},
            'lifestyle_interventions': {
                'diet': [{
                    'title': '均衡饮食',
                    'description': '遵循中国居民膳食指南',
                    'details': ['食物多样，谷类为主', '多吃蔬果', '适量运动'],
                    'duration': '长期',
                    'evidence_level': 'B级证据',
                    'reference': '中国居民膳食指南2022'
                }],
                'exercise': [{
                    'title': '适量运动',
                    'description': '每周至少150分钟中等强度运动',
                    'details': ['有氧运动为主', '结合抗阻训练', '保持运动乐趣'],
                    'duration': '长期',
                    'evidence_level': 'A级证据',
                    'reference': 'WHO身体活动指南'
                }],
                'medication': [{
                    'title': '健康维护',
                    'description': '无需药物干预，保持健康生活方式',
                    'details': ['定期体检', '关注健康指标', '必要时咨询医生'],
                    'duration': '持续',
                    'evidence_level': 'C级证据',
                    'reference': '预防医学指南'
                }]
            },
            'monitoring_plan': {
                'plan': [{
                    'title': '常规监测',
                    'description': '定期体检，关注健康指标',
                    'details': ['每年全面体检', '关注身体变化'],
                    'duration': '持续',
                    'evidence_level': 'C级证据',
                    'reference': '预防医学指南'
                }],
                'key_metrics': ['体重', '血压'],
                'alert_thresholds': {
                    'blood_pressure': '>140/90mmHg',
                    'weight_change': '>5%'
                }
            },
            'follow_up_schedule': {
                'frequency': '每6个月',
                'next_appointment': (datetime.now() + timedelta(days=180)).strftime('%Y-%m-%d'),
                'focus': '健康维护'
            },
            'emergency_guidance': {
                'emergency_contacts': ['急救电话：120'],
                'warning_signs': ['持续不适症状'],
                'immediate_actions': ['及时就医咨询']
            },
            'guidelines_references': [self.guidelines['lifestyle']],
            'implementation_timeline': {
                'immediate': ['保持健康习惯'],
                '1_month': ['优化生活方式'],
                '3_months': ['评估效果'],
                '6_months': ['全面体检']
            }
        }
